// 导入 express 模块
const express = require("express"),
  cors = require("cors"),
  bodyParser = require("body-parser"),
  userRouter = require("./router/user"),
  userInfoRouter = require("./router/userinfo"),
  artcateRouter = require("./router/artcate"),
  articleRouter = require("./router/article"),
  { secretKey } = require("./config")

const expressJWT = require("express-jwt")
console.log(expressJWT)
// 创建 express 的服务器实例
const app = express()

// 注册全局中间件
app.use(function (req, res, next) {
  // 定义方法
  res.sendError = function (err) {
    // 这个方法就是来发送错误的·
    // 认为 err不是错误对象就是字符串
    res.send({ status: 1, message: err instanceof Error ? err.message : err })
  }
  next() // 这里必须执行next 意味着下一个中间件可以执行
})

// 注册解析token的中间件 排除以/api开头的检验
// 中间件检查token 解析token 没有token或者解析失败 => 进入到最终的错误中间件
app.use(
  expressJWT({ secret: secretKey, algorithms: ["HS256"] }).unless({
    path: [/^\/api\//],
  })
)

app.use(cors()) // 支持项目跨域  access-control-allow-origin: *
app.use(bodyParser()) // 解析表单的请求体数据

app.use("/api", userRouter) // /api 前缀

app.use("/my", userInfoRouter) // 注册个人中心的接口

app.use("/my/article", artcateRouter) // 注册文章类别接口

app.use("/my/article", articleRouter) // 注册文章管理的接口

// write your code here...

//  全局错误中间件需要放到 所有中间件最后 捕获错误

app.use(function (err, req, res, next) {
  if (err.name === "UnauthorizedError") {
    // 此时表示 token认证失败
    res.sendError("身份认证失败")
    return
  }
  // 只要是错误就会进来
  res.sendError(err) // 直接响应错误
})

// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(8888, function () {
  console.log("api server running at http://127.0.0.1:8888")
})
